// 定义一个接口
// 语法 interface 接口名{} 接口名首字母一般习惯用I开头
interface IUser {
    name:string | number
    age:number
    sex:string
    aa:undefined
    flag:boolean
    hubby?:string //可选属性  属性?:类型
    [prop:string]:string|number|undefined|boolean//确定属性类型和可选属性的类型必须是 任意属性类型的子集
    readonly id:number
}

// 用接口约束对象
let obj:IUser = {
    name:'张三',
    flag:true,
    aa:undefined,
    age:18,
    sex:'男',
    hubby:'玩游戏',//可选属性 可选实行可有可无
    email:'123@123',
    phone:'122222',
    id:100
    
   
}
// 综上所述：增加变量和减少变量是不允许的，改变属性的数据类型是不允许的；可见，赋值的时候，变量的形状必须和接口的形状保持一致

console.log(obj.name);
obj.name = '李四'
console.log(obj.name);

// obj.id = 200   //无法更改只读属性的值
// 只读的约束存在于第一次给对象赋值的时候，而不是第一次给只读属性赋值的时候
console.log(obj.id);


// 定义一个接口 约束我们的参数
interface IParams {
    method:string,
    url:string,
    data?:any
}

// request 要定返回值类型
function request(params:IParams):any{
   return new Promise((resolve,reject)=>{
    let ajax = new XMLHttpRequest()
    ajax.open(params.method,params.url)
    ajax.send(params.data)
    ajax.onreadystatechange = function(){
        if(ajax.status==200 && ajax.readyState==4){
            resolve(JSON.parse(ajax.response))
        }
    }
   })
}
// // 定义一个接口约束  res
interface IRes{
   [prop:string]:any
}
request({method:'get',url:'https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata'}).then((res:IRes)=>{
    console.log(res);
    
})

// 定义一个接口来约束我们的数组

interface IArr {
    [prop:number]:any
}

let arr:IArr = [1,2,3,4,5,'1',true,undefined,null]
console.log(arr);





